package com.java.base.exercise.jvm;

import cn.hutool.json.JSONUtil;

import java.util.concurrent.TimeUnit;

/**
 * @Author RenPu
 * @Date 2021/10/12 16:22
 * @Version 1.0
 * @Description: 模拟GC回收，在finalize（）进行对象逃离GC的回收，使用this赋值给对象成员变量或者类的变量
 * 以及验证finalize（）方法只会被系统调用一次：执行俩次同样的代码，
 * 第一次对象逃离GC回收成功，
 * 第二次由于finalize（）方法只会被系统调用一次，所以对象未能逃离GC的回收
 **/
public class FinalizeEscapeGC {

    public static FinalizeEscapeGC SAVE_HOOK = null;

    public void isAlive() {
        System.out.println("I am still alive ! ! ! !");
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println(" Finalize mehtod executed ! ! ");
        FinalizeEscapeGC.SAVE_HOOK = this;
    }

    public static void main(String[] args) throws Throwable {

        /**
         * 模拟在
         */
        SAVE_HOOK = new FinalizeEscapeGC();
        SAVE_HOOK = null;
        System.gc();
        TimeUnit.SECONDS.sleep(1);
        if (SAVE_HOOK != null) {
            SAVE_HOOK.isAlive();
        } else {
            System.out.println("I am Dead！ ！ ！ ");

        }

        SAVE_HOOK = null;
        System.gc();
        TimeUnit.SECONDS.sleep(1);
        if (SAVE_HOOK != null) {
            SAVE_HOOK.isAlive();
        } else {
            System.out.println("I am Dead！ ！ ！ ");

        }
    }


}
